package com.heima.showWhatTheIOC.service.Impl;

import com.heima.showWhatTheIOC.Dao.HelloDao;
import com.heima.showWhatTheIOC.factory.BeanFactory;
import com.heima.showWhatTheIOC.service.HelloService;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

/**
 * @Author: Ethan Yankang
 * @Program: SpringBilibili
 * @Date: 2024-09-01 15:03
 **/
public class HelloServiceImpl implements HelloService {
//    版本一：经典三层架构
//    private HelloDao helloDao=new HelloDaoImpl2();

//    版本二：使用静态工厂
/*
 * @description 如果再有新的Dao实现，比如现在我的数据库变更了，那么就有新的Dao层，
 * 就又要重新依赖新的Dao实现，重新编码，很麻烦，而这种功能又是比较常见的，所以急需改变这种变态费时间的模式，
 * 这里就自然而然引出了使用静态工厂类来生产特定类。不在硬编码在serviceImpl中了。
 *
 *
  private HelloDao helloDao=new HelloDaoImpl2();
    @Override
    public List<String> findAll() {
        return this.helloDao.findAll();
    }
 */

    private  HelloDao helloDao= (HelloDao) BeanFactory.getDao("helloDao");

    /*
     * @description 新增HashMap缓存作为确保单例的机制
     * @params
     * @return
     */


    public HelloServiceImpl() throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        /*
         * @description 这里没循环一次就创建一个对象，而Spring的本质是单例的对象创建，怎么办呢？____使用HashMap缓存来去重！！！(IOC内部就是HashMap缓存@@@！！！)
         * @params
         * @return
         */

        for (int i = 0; i < 10; i++) {
            System.out.println(BeanFactory.getDao("helloDao"));
        }
    }

    @Override
    public List<String> findAll() {
        return this.helloDao.findAll();
    }
}
